package com.earltech.vertdemo.socket;

import com.fasterxml.jackson.databind.util.JSONPObject;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.json.JsonObject;
import io.vertx.core.net.NetServer;
import io.vertx.core.net.NetServerOptions;
import io.vertx.core.net.NetSocket;
import io.vertx.core.parsetools.RecordParser;

import java.util.concurrent.ConcurrentHashMap;

/*
 * @author <a href="http://tfox.org">Tim Fox</a>
 */
public class TcpServer extends AbstractVerticle {

  private ConcurrentHashMap<String, NetSocket> socketMap = new ConcurrentHashMap<String,NetSocket>();

  private ConcurrentHashMap<String, NetSocket> bocastMap = new ConcurrentHashMap<String,NetSocket>();

  private ConcurrentHashMap<String, NetSocket> groupMap = new ConcurrentHashMap<String,NetSocket>();

  // Convenience method so you can run it in your IDE
//  public static void main(String[] args) {
////    Runner.runExample(TcpServer.class);
//    TcpServer tcpServer = new TcpServer();
//    Vertx.vertx().deployVerticle(tcpServer);
//
//  }

  public ConcurrentHashMap<String, NetSocket> getSocketMap() {
    return socketMap;
  }

  public void setSocketMap(ConcurrentHashMap<String, NetSocket> socketMap) {
    this.socketMap = socketMap;
  }

  public ConcurrentHashMap<String, NetSocket> getBocastMap() {
    return bocastMap;
  }

  public void setBocastMap(ConcurrentHashMap<String, NetSocket> bocastMap) {
    this.bocastMap = bocastMap;
  }

  public ConcurrentHashMap<String, NetSocket> getGroupMap() {
    return groupMap;
  }

  public void setGroupMap(ConcurrentHashMap<String, NetSocket> groupMap) {
    this.groupMap = groupMap;
  }

  @Override
  public void start() throws Exception {

    NetServerOptions options = new NetServerOptions().setPort(4321);
    NetServer server = vertx.createNetServer(options);

    server.connectHandler(socket -> {
      // Handle the connection in here

      final String[] ramdomIdStr = new String[1];
      final String[] tagStr = new String[1];
      final String[] aliasStr = new String[1];

      socket.exceptionHandler(buffer ->{
        System.out.println(buffer.toString());
        bocastMap.remove(ramdomIdStr[0]);

        if(tagStr[0]!=null){
          socketMap.remove(tagStr[0]);
        }

        if(aliasStr[0]!= null){
          groupMap.remove(aliasStr[0]);
        }
      });

      final RecordParser parser = RecordParser.newDelimited("\n", h -> {

        String[] split = h.toString().split("/");//简单协议解析过程

        String[] ramdomId = split[0].split(":");

        String[] tag = split[1].split(":");

        String[] alias = split[2].split(":");

        String[] message = split[3].split(":");

        ramdomIdStr[0] = ramdomId[1];
        tagStr[0] = tag[1];
        aliasStr[0] = alias[1];
        bocastMap.put(ramdomId[1],socket);//连接注册，注册socket集合，方便管理

        if(tagStr[0]!=null&&!"".equals(tagStr[0].trim())){
          socketMap.put(tag[1],socket);
        }

        if(aliasStr[0]!= null&&!"".equals(aliasStr[0].trim())){
          groupMap.put(alias[1],socket);
        }


        System.out.println("connect count:" + bocastMap.size() +""+ socketMap.size()+""+groupMap.size());
        System.out.println(h.toString());
      });

      socket.handler(buffer -> {
////        socket.write("xxoo");
//        vertx.setPeriodic(i[0],(l) -> {
//          socket.write("xxoo" + i[0]);
//          i[0] = i[0]+5000;
//        });
//        System.out.println(buffer.toString());
        parser.handle(buffer);

      });
        socket.write("xxo\n");
//      socket.write("这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-\n这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复--这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复--这里是服务器，收到请回复--这里是服务器，收到请回复----这里是服务器，收到请回复------这里是服务器，收到请回复---这里是服务器，收到请回复------这里是服务器，收到请回复------这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复----这里是服务器，收到请回复-----这里是服务器，收到请回复------这里是服务器，收到请回复--这里是服务器，收到请回复----这里是服务器，收到请回复-这里是服务器，收到请回复--这里是服务器，收到请回复-这里是服务器，收到请回复-这里是服务器，收到请回复--这里是服务器，收到请回复--这里是服务器，收到请回复这里是服务器，收到请回复-这里是服务器，收到请回复--这里是服务器，收到请回复-这里是服务器，收到请回复--------这里是服务器，收到请回复-----------------------------------------------------------------------------------------!\n");

//      Pump.pump(socket, socket).start();

      if (socket.writeQueueFull()) {
        socket.pause();
        socket.drainHandler(done -> {
          socket.resume();
        });
      }

    });

    server.listen(1234,"192.168.1.100",res->{
      if(res.succeeded()){//res 是指成功启动服务器后执行结果
        System.out.println("Server is now listening!");
      } else {
        System.out.print("Fail to bind!");
      }
    });
  }
}